www.gusucode.com > MIMO与SISO仿真程序 > MIMO-OFDM/all code/results_MISO_OFDMA_v1.m

    clc; clear all;close all; warning off
% simulate 2x1 OFDMA System with timing offsets 

data = 2^16;                                    % data points

n_fft = 128;                                     % fft size
    
n_cp = 16;                                      % cyclic prefix

snr = [0:2:30];

errors1 = zeros(size(snr));
ber1 = zeros(size(snr));
errors2 = zeros(size(snr));
ber2 = zeros(size(snr));

OFDM = n_fft+2*n_cp;
%% generate data

binary_data1 = round(rand(data,1));              % generate data
binary_data2 = round(rand(data,1));
bin1= binary_data1;
bin2= binary_data2;
% channel
h = [randn() + randn()*1i];
h = [h h];
%h = [randn()+randn()*1i , randn()+randn()*1i]; 
%% modulation

for mod_value = 1:3
    % bits per symbol
    if mod_value == 1
        symbols = 2;   
    elseif mod_value == 2
        symbols = 4;
    else 
        symbols = 6;
        while floor(length(binary_data1)/symbols) ~= length(binary_data1)/symbols
        binary_data1 = [binary_data1; zeros(1,1)];                                    %padding for symbol mapping
        end
        while floor(length(binary_data1)/symbols/n_fft) ~= length(binary_data1)/symbols/n_fft
        binary_data1 = [binary_data1; zeros(6,1)];                                    %padding for subcarriers mapping
        end
    
        while floor(length(binary_data2)/symbols) ~= length(binary_data2)/symbols
        binary_data2 = [binary_data2; zeros(1,1)];                                    %padding for symbol mapping
        end
        while floor(length(binary_data2)/symbols/n_fft) ~= length(binary_data2)/symbols/n_fft
        binary_data2 = [binary_data2; zeros(6,1)];                                    %padding for subcarriers mapping
        end
    
    end
    
mod_method = 2^symbols;       
                                                
mod_data1 = qammod(binary_data1,mod_method,'unitaveragepower',true,'inputtype','bit');
mod_data2 = qammod(binary_data2,mod_method,'unitaveragepower',true,'inputtype','bit');

%% splitting data up between the transmitters
Tx1 = mod_data1;
Tx2 = mod_data2;

% allocating data onto each subcarrier

%% subcarriers
Xk1 = reshape(Tx1,n_fft/2,length(Tx1)/(n_fft/2)); % 64 sub carriers, per user
Xk2 = reshape(Tx2,n_fft/2,length(Tx2)/(n_fft/2));



%% ifft
% ofdm symbol

% ifft
    Xn1 = ifft(Xk1);
    Xn2 = ifft(Xk2);
% CP
    Xn1_cp = [Xn1((end - n_cp + 1):end,:);Xn1];  
    Xn2_cp = [Xn2((end - n_cp + 1):end,:);Xn2];  
  
    
Xn1_pad = [ Xn1_cp ; zeros(size(Xn1_cp)) ];
Xn2_pad = [ zeros( size(Xn2_cp)) ; Xn2_cp ];

% Parallel to Serial
    xn1 = Xn1_pad(:);
    xn2 = Xn2_pad(:);

%% channel


for k = 1:length(snr)
% channel gain
    yn11 = xn1*h(1);            % y time, receiver 
    yn21 = xn2*h(2);
db = snr(k);
    %noise
    yn11 = awgn(yn11,db,'measured');
    yn21 = awgn(yn21,db,'measured');
%    % delay
    delay11 = 23;
    delay21 = 0;
    
    
    % tail of previous symbol added to front of next symbol - ISI
    for i = 0:(length(yn11)/(OFDM))-2
        if delay11 ~= 0
        yn11(1+OFDM+OFDM*i:1+OFDM+delay11+OFDM*i) = yn11(1+OFDM+OFDM*i:1+OFDM+delay11+OFDM*i) ...
            + yn11(OFDM/2-delay11+OFDM*i:OFDM/2+OFDM*i);
        end
        if delay21 ~= 0
        yn21(1+OFDM+OFDM*i:1+OFDM+delay21+OFDM*i) = yn21(1+OFDM+OFDM*i:1+OFDM+delay21+OFDM*i) ...
            + yn21(OFDM-delay21+OFDM*i:OFDM+OFDM*i);
        end
    
    end
    if delay11 ~= 0
    yn11(1:OFDM) = [zeros(delay11+1,1);yn11(1:OFDM-delay11-1)];      
    end
    if delay21 ~= 0
    yn21(OFDM+1:2*OFDM) = [zeros(delay21+1,1);yn21(OFDM+1:2*OFDM-delay21-1)];  
    end
%         superposition
    yn = yn11 + yn21; 
    
%% receiver
    %serial to parallel 128+CP streams
    yn_sub = reshape(yn,n_fft+2*n_cp,length(Xn1));
% %   users
    Yn_sub1 = yn_sub(1:80,:);                               % higher order decision block
    Yn_sub2 = yn_sub(81:160,:);
    
%     % delay
%     delay11 = 20;
%     delay21 = 0;
% 
%     for i = 0:(length(yn11)/(OFDM))-2
%         if delay11 ~= 0
%         Yn11(1+OFDM+OFDM*i:1+OFDM+delay11+OFDM*i) = Yn11(1+OFDM+OFDM*i:1+OFDM+delay11+OFDM*i) ...
%             + yn11(OFDM-delay11+OFDM*i:OFDM+OFDM*i);
%         end
%         if delay21 ~= 0
%         yn21(1+OFDM+OFDM*i:1+OFDM+delay21+OFDM*i) = yn21(1+OFDM+OFDM*i:1+OFDM+delay21+OFDM*i) ...
%             + yn21(OFDM-delay21+OFDM*i:OFDM+OFDM*i);
%         end
% 
%     end
%     if delay11 ~= 0
%     yn11(1:OFDM) = [zeros(delay11+1,1);yn11(1:OFDM-delay11-1)];      
%     end
%     if delay21 ~= 0
%     yn21(1:OFDM) = [zeros(delay21+1,1);yn21(1:OFDM-delay21-1)];  
%     end    
    
        % remove CP
    yn_sub_rcp1 = Yn_sub1((n_cp+1):end,:);
    yn_sub_rcp2 = Yn_sub2((n_cp+1):end,:);
    
    %% DFT convert back to freq domain
    Yk_block1 = fft(yn_sub_rcp1);
    Yk_block2 = fft(yn_sub_rcp2);

% P/S
    Yk1_s = Yk_block1(:);              % transform 64 subchannels back into 1 stream
    Yk2_s = Yk_block2(:);       
    
%     delay = 0;
%     Yk1_s = [zeros(delay,1); Yk1_s];
    
%% Channel estimation
% assume perfect channel estimation, so we know what h1 and h2 are

Xhat1 = Yk1_s./h(1);
Xhat2 = Yk2_s./h(2);

%% demodulate
X_demod1 = qamdemod(Xhat1,mod_method,'unitaveragepower',true,'outputtype','bit');
X_demod2 = qamdemod(Xhat2,mod_method,'unitaveragepower',true,'outputtype','bit');

output1 = X_demod1(:).';
output2 = X_demod2(:).';
%%
%  binary_data1 = [bin1; zeros(delay,1)];
%  binary_data2 = [bin2; zeros(delay,1)];


errors1(mod_value,k) = 0;
for i = 1:length(binary_data1)-n_fft*symbols
    if output1(i+n_fft*symbols) ~= binary_data1(i+n_fft*symbols)
        errors1(mod_value,k) = errors1(mod_value,k) + 1;
    end
end
ber1(mod_value,k) = errors1(mod_value,k)/length(binary_data1);


errors2(mod_value,k) = 0;
for i = 1:length(binary_data2)-n_fft*symbols
    if output2(i+n_fft*symbols) ~= binary_data2(i+n_fft*symbols)
        errors2(mod_value,k) = errors2(mod_value,k) + 1;
    end
end
ber2(mod_value,k) = errors2(mod_value,k)/length(binary_data2);


end
semilogy(snr-10*log10(symbols),ber1(mod_value,:),'-',snr-10*log10(symbols),ber2(mod_value,:),'-')
%semilogy(snr,ber2(mod_value,:),'o-');
title('Two users One receiver with Time Offset greater than CP by 50%'); legend('4QAM user1','4QAM user2','16QAM user1','16QAM user2','64QAM user1','64QAM user2');
xlabel('E_b/N_o (dB)'); ylabel('BER'); grid on;hold on
end
error = zeros(1,length(binary_data1));
for i = 1:length(binary_data1)
    if output1(i) ~= binary_data1(i)
        error(i) = 1;
    end
end

% scatterplot(Yk_block1(:,1))
% 
% scatterplot(Yk_block1(:,2))